home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
004
/
mathstat.arc
/
NORMAL-Z.BAS
< prev
next >
Wrap
BASIC Source File
|
1982-06-06
|
7KB
|
134 lines
100 '**********************************************************************
110 '******** ***********
120 '******** NORMAL DISTRIBUTION ROUTINES ***********
130 '******** ***********
140 '**********************************************************************
150 ' * COPYRIGHT 1982 - CRAIG W. UTHE *
160 ' * WRITTEN 3/3/82 BY CRAIG W. UTHE *
170 ' * * * * * *
180 ' * ANY INDIVIDUAL MAY COPY THIS PROGRAM *
190 ' * AND MAKE MODIFICATIONS TO IT IF THAT *
200 ' * INDIVIDUAL ARRANGES TO CONTRIBUTE ONE *
210 ' * OTHER PROGRAM TO THE PHILA. AREA IBM *
215 ' * PC USER GROUP PUBLIC DOMAIN SOFTWARE *
220 ' * EXCHANGE LIBRARY. HOWEVER, COPIES *
230 ' * ARE NOT ALLOWED TO BE SOLD, NOT IN *
240 ' * WHOLE NOR IN PART, NOT SEPARATELY *
250 ' * NOR JOINTLY WITH OTHER SOFTWARE. *
260 ' *********************************************
270 '
280 '
1000 'MASTER-CONTROL ROUTINE
1010 CLS
1020 PRINT "This program computes areas under the normal distribution"
1030 PRINT "probability curve from the mean to a designated `Z' value."
1040 PRINT "This program also can compute `Z' values from a given area."
1050 PRINT
1060 PRINT "Just as in most statistical tables, only half the curve is
1070 PRINT "considered. Z values must be between -4 and +4 (these"
1080 PRINT "limits are somewhat arbitrary) and area figures must be"
1090 PRINT "between 0 and 0.5 (actually .49997). If out-of-range"
1100 PRINT "figures are input, the nearest range limit is assumed"
1110 PRINT "instead."
1120 PRINT
1130 PRINT "HIT ANY KEY TO START"
1140 SELECTION$ = INKEY$ : IF SELECTION$ = "" THEN GOTO 1140 'SAME LINE
1150 ' Area results (given Z) are accurate to the 5 displayed digits.
1160 ' Z values are accurate to 2 digits based on an input area,
1170 ' or the 3 displayed digits based on the program's approximation
1180 ' of that area.
1190 '
1200 ' This precision can be changed by changing the precision
1210 ' constants in the program from their 0.000001 setting.
1220 ' For higher precision, you might also want to change the
1230 ' variables to double, instead of single, precision form.
1240 ' With higher precision, you may wish to change the number
1250 ' of digits displayed, too.
1260 '
1270 ' Out of respect, please do not mutilate the structured
1280 ' programming approach that makes changes so easy and
1290 ' makes the program almost readable. Of course you can
1300 ' easily use the subroutines in more elaborate programs.
1310 ' This program is fairly insignificant by itself.
1320 '
1330 SELECTION$ = "1" 'initialization
1340 WHILE (SELECTION$ = "1" OR SELECTION$ = "2")
1350 CLS : PRINT STRING$(60,42)
1360 PRINT : PRINT "MENU:"
1370 PRINT : PRINT " <1> . . . . . . . . COMPUTE AREA FROM Z"
1380 PRINT : PRINT " <2> . . . . . . . . COMPUTE Z VALUE FROM AREA"
1390 PRINT : PRINT " <ANY OTHER KEY> . . EXIT PROGRAM"
1400 PRINT : PRINT STRING$(60,45)
1410 PRINT : PRINT "HIT ANY KEY IN INDICATED RANGE TO MAKE SELECTION:"
1420 SELECTION$ = INKEY$ : IF SELECTION$ = "" THEN GOTO 1420 'SAME LINE
1430 CLS : PRINT "THANK YOU."
1440 IF 0 = INSTR("12",SELECTION$) THEN : PRINT "I HOPE THE PROGRAM WAS USEFUL TO YOU. BYE." : GOTO 1480 'WEND
1450 ON INSTR("12",SELECTION$) GOSUB 3000,2000
1460 'IE: IF 1, GOSUB COMPUTE-Z-FROM-AREA ROUTINE
1470 ' IF 2, GOSUB COMPUTE-AREA-FROM-Z ROUTINE
1480 WEND
1490 END
1500 '
1510 '
2000 'COMPUTE-Z-FROM-AREA ROUTINE
2010 PRINT : PRINT STRING$(80,42) : PRINT
2020 QUIT% = 0
2030 WHILE NOT QUIT%
2040 PRINT "INPUT AREA VALUE FROM WHICH TO COMPUTE FREQUENCY."
2050 PRINT "(ENTRIES OVER 5.0 CAUSE RETURN TO MENU.)"
2060 INPUT "INPUT AREA VALUE (0 TO 0.49997): ",AREA
2070 IF AREA > 5 THEN QUIT% = -1 : GOTO 2230 'WEND
2080 HI.CALCULATED.AREA = .49997 : HI.Z = 4 '*** area < .49997
2090 LO.CALCULATED.AREA = 0 : LO.Z = 0 '*** area > 0
2100 IF AREA >= .49997 THEN CALCULATED.AREA = .49997 : Z = 4 : GOTO 2170
2110 IF AREA <= 0 THEN CALCULATED.AREA = 0 : Z = 0 : GOTO 2170 'PRNT
2120 WHILE ABS(CALCULATED.AREA - AREA) > .000001
2130 IF AREA > CALCULATED.AREA THEN LO.CALCULATED.AREA = CALCULATED.AREA : LO.Z = Z ELSE HI.CALCULATED.AREA = CALCULATED.AREA : HI.Z = Z
2140 Z = (LO.Z + HI.Z) / 2
2150 GOSUB 4000 'McLAUREN-METHOD-AREA-CALCULATION ROUTINE
2160 WEND
2170 PRINT : PRINT "THE NORMAL-DISTRIBUTION Z-VALUE CORRESPONDING"
2180 PRINT "TO A MEAN-TO-Z AREA OF ";
2190 PRINT USING "#.#####"; CALCULATED.AREA;
2200 PRINT " is: ";
2210 PRINT USING "#.###"; Z
2220 PRINT : PRINT STRING$(80,42) : PRINT
2230 WEND
2240 RETURN
2250 '
3000 'COMPUTE-AREA-FROM-Z ROUTINE
3010 PRINT : PRINT STRING$(80,42) : PRINT
3020 QUIT% = 0
3030 WHILE NOT QUIT%
3040 PRINT "INPUT Z VALUE FROM WHICH TO COMPUTE FREQUENCY."
3050 PRINT "(ENTRIES OVER 5.0 CAUSE RETURN TO MENU.)"
3060 INPUT "INPUT Z VALUE (-4.0 TO +4.0): ", Z
3070 IF Z >= 5 THEN QUIT% = -1 : GOTO 3150 'WEND
3080 IF ABS(Z) >= 4 THEN CALCULATED.AREA = .49997 : Z.SGN% = SGN(Z) : Z = 4 :GOTO 3100 'PRINT OUTPUT
3090 GOSUB 4000 'McLAUREN-METHOD-AREA-CALCULATION ROUTINE
3100 PRINT :PRINT "THE AREA UNDER THE NORMAL DISTRIBUTION CURVE"
3110 PRINT "FROM THE MEAN TO Z = " Z.SGN%*Z " IS: ";
3120 PRINT USING "#.#####"; CALCULATED.AREA
3130 PRINT
3140 PRINT : PRINT STRING$(80,42) : PRINT
3150 WEND
3160 RETURN
3170 '
4000 'McLAUREN-METHOD-AREA-CALCULATION ROUTINE
4010 '
4020 Z.SGN% = SGN(Z) : Z = ABS(Z) : Z.SQR = Z*Z
4030 CALCULATED.AREA = Z * (1/SQR(2*3.141592654#))
4040 Z.CONSTANT = CALCULATED.AREA
4050 PRECISION.ERROR = 1 : INTERMEDIATE.TERM = 1 : I% = 1
4060 '
4070 WHILE ABS(PRECISION.ERROR) > .000001
4080 INTERMEDIATE.TERM = -(INTERMEDIATE.TERM * Z.SQR) / (2*I%)
4090 PRECISION.ERROR = Z.CONSTANT * (INTERMEDIATE.TERM / (2*I% + 1))
4100 CALCULATED.AREA = CALCULATED.AREA + PRECISION.ERROR
4110 I% = I% + 1
4120 WEND
4130 CALCULATED.AREA = CALCULATED.AREA - PRECISION.ERROR
4140 RETURN
I% = I% + 1
4120 WEND
4130